<?php
/****************************************************************\
DigitalDaigor RssGen V1.0

Funzionalità:
Crea un RSS

Data Creazione:
06/06/08

Autore:
Digital Daigor (info.digitaldaigor@gmail.com)

Esempio:
include("class.ddrssgen.php");

$rss = new DDRssGen("DigitalD RSS","http://www.php.vilnet.it","il mio rss generator");
$rss -> rssAddOpzionali("copyright","2008/2016 Digital Daigor");
$rss -> rssAddImmagine("http://www.url.com","title","link","descrizione","100","70");
$rss -> rssAddArticolo("titolo","http://www.link.it","descrizione","testo","autore","Fri, 06 Jun 2008 23:46:18 +0200");
$rss -> rssAddArticolo("titolo2","http://www.link2.it","descrizione2","testo2testo2testo2testo2testo2testo2testo2testo2testo2testo2","autore2","Fri, 06 Jun 2008 23:45:18 +0200",array("tagOpzionaleNonPrevisto" => "E il suo valore"));
$rss -> rssSetFile("","rss");
$rss -> rssCreate();

Attenzione:
Per permettere la corretta  validazione del RSS, si prega di, oltre inserire i dati esattinella struttura, inserire i tag opzionali prima del'inserimento delle news.

Licenza:
Copyright (C) 2008 Daigor Landi (info.digitaldaigor@gmail.com)
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

\****************************************************************/
class DDRssGen
{
	//Prima parte, con tag principali, del rss
	var $rss_struct_1 = array("title" => "","link" => "","description" => "","language" => "","copyright" => "","managingEditor" => "","webMaster" => "","category" => "","generator" => "","ttl" => "", "lastBuildDate" => "", "docs" => "");
	//Parte riservata ai tag opzionali
	var $rss_struct_2 = array();
	//Tag per l'inserimento delle immagine del rss
	var $rss_struct_4 = array("image" => array("url" => "","title" => "","link" => "","description" => "","width" => "","height" => ""));
	//Parte per gli articoli
	var $rss_struct_3 = array("item" => array("0" => array("title" => "","link" => "","description" => "","pubDate" => "","author" => "")));
	
	var $rss_atributi = array();
	
	//Indicazioni per la validazione
	var $rss_valida = array("link" => "link", "managingEditor" => "email", "webMaster" => "email", "url" => "link", "height" => "int", "width" => "int", "author" => "email");
	var $xml_version = "1.0";
	var $rss_version = "2.0";
	var $num_art = 0;
	var $salva_file = 0;
	var $cartella_file;
	var $nome_file;
	var $base_url;
	var $intestazione_rss;
	var $intestazione_xml;
	var $atom;
	
	var $rss;
	
	function __construct($titolo,$link,$descrizione,$base_url)
	{
		$this -> rss_struct_1['title'] = $titolo;
		$this -> rss_struct_1['link'] = $link;
		$this -> rss_struct_1['description'] = $descrizione;
		$this -> rss_struct_1['generator'] = "DDRssGen V1.1 Digital Daigor info.digitaldaigor@gmail.com";
		$this -> base_url = $base_url;
	}
	
	//Setta i parametri per la crazione del rss
	function rssSetFile($cartella,$file)
	{
		$this -> cartella_file = $cartella;
		$this -> nome_file = $file;
		$this -> salva_file = 1;
	}
	
	//Aggiunge tag opzionali, o non presenti
	function rssAddOpzionali($tag,$val,$array_atributi="")
	{
		if(in_array($tag,array_keys($this -> rss_struct_1)))
		{
			$this -> rss_struct_1[$tag] = $val;
		}
		else
		{
			$this -> rss_struct_2[$tag] = $val;
		}
		
		$atributi = "";
		if(is_array($array_atributi))
		{
			foreach($array_atributi as $key => $val)
			{
				$atributi = " ".$key."='".$val."' ";
			}
		}
		$this -> rss_atributi[$tag] = $atributi;
	}
	
	//Aggiunge un articolo
	function rssAddArticolo($titolo,$link,$descrizione,$contenuto,$autore,$date,$opzionali="")
	{
		$this -> rss_struct_3['item'][$this -> num_art]['title'] = $titolo;
		$this -> rss_struct_3['item'][$this -> num_art]['link'] = $link;
		$this -> rss_struct_3['item'][$this -> num_art]['description'] = $descrizione;
		$this -> rss_struct_3['item'][$this -> num_art]['author'] = $autore;
		
		if(is_array($opzionali))
		{
			foreach($opzionali as $key => $val)
			{
				$this -> rss_struct_3['item'][$this -> num_art][$key] = $val;
			}
		}
		
		if((int)$date > 0)
		{
			$this -> rss_struct_3['item'][$this -> num_art]['pubDate'] = date("r",$date);
		}
		else
		{
			$this -> rss_struct_3['item'][$this -> num_art]['pubDate'] = $date;
		}
		
		$this -> num_art = $this -> num_art+1; 
	}
	
	//Aggiunge l'immagine del rss
	function rssAddImmagine($url,$title,$link,$description,$width,$height)
	{
		$this -> rss_struct_4['image']['url'] = $url;
		$this -> rss_struct_4['image']['title'] = $title;
		$this -> rss_struct_4['image']['link'] = $link;
		$this -> rss_struct_4['image']['description'] = $description;
		$this -> rss_struct_4['image']['width'] = $width;
		$this -> rss_struct_4['image']['height'] = $height;
	}
	
	//Istanzializza la creazione del rss
	function rssCreate()
	{	
		$this -> rssCrea();
		$scritto = 0;
		
		if($this -> nome_file != "" && $this -> salva_file  = 1)
		{
			$fp = fopen($this -> cartella_file.$this -> nome_file.".xml","w");
			if($fp)
			{
				$fr = fwrite($fp,$this -> rss);
				if($fr)
				{
					return true;
				}
				else
				{
					return false;
				}
			}
			else
			{
				return false;
			}
		}
		else
		{
			header("Content-type: application/xml");
			echo $this -> rss;
			return true;
		}
		if($this -> save_error_file == true || $this -> save_error_file == 1)
		{
			echo "ok";
			$this -> errReport();
		}
	}
	
	//Controlla se il contenuto dei tag è corretto
	function controllaDati($tag,$val,$altro="")
	{
		$tipo = $this -> rss_valida[$tag];
		
		if($tipo == "link")
		{
			if(strpos($val,"http://") === 0)
			{
				return true;
				break;
			}
			else
			{
				return false;
				break;
			}
		}
		else if($tipo == "email")
		{
			if(!(!eregi("^[^@]{1,64}@[^@]{1,255}$",$val)))
			{
				return true;
				break;
			}
			else
			{
				return false;
				break;
			}
		}
		else if($tipo == "int")
		{
			if(is_int($val))
			{
				return true;
				break;
			}
			else
			{
				return false;
				break;
			}
		}
		else
		{
			return true;
			break;
		}
	}
	
	function settaRss($array)
	{
		$this -> intestazione_rss = "<rss ";
		
		if(is_array($array))
		{
			foreach($array as $key => $val)
			{
				$this -> intestazione_rss .= $key."='".$val."' ";
			}
		}
		
		$this -> intestazione_rss .= ">";
	}
	
	function settaXml($array)
	{
		$this -> intestazione_xml = "<?xml ";
		
		if(is_array($array))
		{
			foreach($array as $key => $val)
			{
				$this -> intestazione_xml .= $key."='".$val."' ";
			}
		}
		
		$this -> intestazione_xml .= "?>";
	}
	
	//Crea la struttura del rss
	private function rssCrea()
	{
		if(!strlen(trim($this -> intestazione_rss))>0)
		{
			$this -> intestazione_rss = "<rss version='2.0'>";
		}
		if(strpos($this -> intestazione_rss,"xmlns:atom") !== 0)
		{
			$this -> atom = "<atom:link href=\"".$this -> base_url."/".$this -> nome_file.".xml\" rel=\"self\" type=\"application/rss+xml\" />\r\n";
		}
		if(!strlen(trim($this -> intestazione_xml))>0)
		{
			$this -> intestazione_xml = "<?xml version='1.0'?>";
		}
		
		$this -> rss = $this -> intestazione_xml."\r\n".$this -> intestazione_rss."\r\n	<channel>\r\n		".$this -> atom;
		
		$this -> rss_struct = array_merge($this -> rss_struct_1,$this -> rss_struct_2,$this -> rss_struct_4,$this -> rss_struct_3);
		
		foreach($this -> rss_struct as $key => $val)
		{
			if(is_array($val))
			{
				$i = 0;
				foreach($this -> rss_struct[$key] as $key2 => $val2)
				{
					if(strlen(trim($val2))>0)
					{
						$i++;
					}
				}
				if($i > 0)
				{
					$this -> rss .= "		<".$key." ".$this -> rss_atributi[$key].">\r\n";
					foreach($this -> rss_struct[$key] as $key2 => $val2)
					{
						$add_fine_tag = 0;
						if(is_array($val2))
						{
							foreach($this -> rss_struct[$key][$key2] as $key3 => $val3)
							{
								if($this -> controllaDati($key3,$val3))
								{
									$this -> rss .= "			<".$key3.">".$val3."</".$key3.">\r\n";
									$add_fine_tag = 1;
								}
							}
							$this -> rss .= "		</".$key.">\r\n";
							$this -> rss .= "		<".$key.">\r\n";
						}
						else
						{
							if(strlen(trim($val2))>0 && $this -> controllaDati($key2,$val2))
							{
								$this -> rss .= "			<".$key2.">".$val2."</".$key2.">\r\n";
							}
						}
						
					}
					$this -> rss .= "		</".$key.">\r\n";
					$this -> rss = str_replace("		<".$key.">\r\n"."		</".$key.">\r\n","",$this -> rss);
				}
			}
			else
			{
				if(strlen(trim($val))>0 && $this -> controllaDati($key,$val))
				{
					$this -> rss .= "		<".$key." ".$this -> rss_atributi[$key].">".$val."</".$key.">\r\n";
				}
			}
		}
		$this -> rss .= "	</channel>\r\n</rss>";
	}
}
?>